TOP

Fuzzy Lookup pour LibreOffice Calc

FUZZYLOOKUP() descriptif

Nous connaissons tous la fonction bien connue VLOOKUP() qui nous aide à combiner les données de différentes tables. Cependant, cette fonction présente un inconvénient important : elle ne peut pas combiner des valeurs similaires, c'est-à-dire que s'il y a une erreur dans le mot, il n'y aura pas de correspondance.

Pour pouvoir combiner des valeurs approximatives, nous pouvons créer notre propre fonction. Appelons-le FuzzyLookup().

Imaginons que nous ayons deux listes. Les deux contiennent à peu près les mêmes éléments, mais ils peuvent être écrits légèrement différemment. La tâche consiste à trouver pour chaque élément de la première liste l'élément le plus similaire de la deuxième liste, c'est-à-dire implémenter une recherche du texte le plus proche le plus similaire.

La grande question, dans ce cas, est de savoir ce qu’il faut considérer comme critère de « similarité ». Juste le nombre de caractères correspondants ? Est-ce que le nombre de matchs consécutifs ? La casse des caractères ou les espaces doivent-ils être pris en compte ? Que faire avec une disposition différente des mots dans une phrase ? Il existe de nombreuses options et il n’existe pas de solution unique : pour chaque situation, l’une ou l’autre sera meilleure que les autres.

Dans notre cas, nous implémentons l'option la plus simple : rechercher par le nombre maximum de correspondances de caractères. Ce n'est pas parfait, mais cela fonctionne plutôt bien dans la plupart des situations.


Code StarBASIC pour la fonction FuzzyLookup

Ajouter fonction FuzzyLookup , ouvrez le menu Tools - Macros - Edit Macros... , sélectionner Module1 et copiez le texte suivant dans le module :

  1. Function FuzzyLOOKUP(LookupValue As String, SrcTable As VariantOptional SimThreshold As SingleAs String   
  2.   ' moonexcel.com.ua   
  3.   Dim Str       As String    
  4.   Dim CellArray As Variant  
  5.   Dim StrArray  As Variant  
  6.     
  7.   If IsMissing(SimThreshold) Then SimThreshold  = 0  
  8.     
  9.   Str      = LCase(LookupValue)  
  10.   StrArray = Split(Str)  
  11.   StrExt   = UBound(StrArray)    
  12.               
  13.   For Each Cell In SrcTable  
  14.                             
  15.     CellArray = Split(LCase(Cell))  
  16.     CellExt   = UBound(CellArray)             
  17.     CellRate  = 0  
  18.       
  19.     ' Nous vérifions chaque mot dans la phrase de recherche   
  20.     For x = 0 To StrExt   
  21.       
  22.       StrWord = StrArray(x)     
  23.       If Len(StrWord) = 0 Then GoTo continue_x  
  24.       MaxStrWordRate = 0  
  25.         
  26.       ' Nous vérifions chaque mot dans la cellule suivante du tableau de valeurs d'origine   
  27.       For i = 0 To CellExt  
  28.           
  29.         CellWord = CellArray(i)  
  30.         If Len(CellWord) = 0 Then GoTo continue_i  
  31.      
  32.         FindCharNum = OccurrenceNum(StrWord, CellWord)  
  33.         StrWordRate = FindCharNum / Max(Len(StrWord),Len(CellWord))  
  34.           
  35.         If StrWordRate > MaxStrWordRate Then MaxStrWordRate = StrWordRate  
  36.         continue_i:  
  37.       Next i              
  38.                           
  39.       CellRate = CellRate + MaxStrWordRate  
  40.       continue_x:  
  41.     Next x                 
  42.           
  43.     ' On garde le meilleur match   
  44.     If CellRate > MaxCellRate Then      
  45.       MaxCellRate = CellRate  
  46.       BestCell    = Cell            
  47.          
  48.       FindCharNum = OccurrenceNum(Str, Cell)  
  49.       SimRate     = FindCharNum / Max(Len(Str),Len(Cell))  
  50.     End If         
  51.           
  52.   Next Cell  
  53.       
  54.   IF SimRate >= SimThreshold Then   
  55.     IF SimThreshold = -1 Then  
  56.       ReturnValue = BestCell + " (" + Format(SimRate, "0.00") + ")"  
  57.     ElseIf SimThreshold = -2 Then  
  58.       ReturnValue = Format(SimRate, "0.00")  
  59.     Else  
  60.       ReturnValue = BestCell  
  61.     End If  
  62.   Else   
  63.     ReturnValue = ""  
  64.   End If      
  65.     
  66.   FuzzyLOOKUP = ReturnValue  
  67. End Function  
  68.   
  69.   
  70. Function OccurrenceNum(ByVal SourceString As StringByVal TargetString As String)  
  71.   For i = 1 To Len(SourceString)                                          
  72.     ' Nous recherchons l'occurrence de chaque symbole   
  73.     Position = InStr(1, TargetString, Mid(SourceString, i, 1), 1)    
  74.     ' On augmente le compteur des coïncidences   
  75.     If Position > 0 Then         
  76.       Count = Count + 1  
  77.       ' Supprimer le symbole trouvé   
  78.       TargetString = Left(TargetString, Position - 1) + Right(TargetString, Len(TargetString) - Position)     
  79.     End If  
  80.   Next i      
  81.   OccurrenceNum = Count  
  82. End Function  
  83.   
  84.   
  85. Function Max(ByVal value1 As VariantByVal value2 As Variant)    
  86.   If value1 > value2 Then  
  87.     Result = value1  
  88.   Else  
  89.     Result = value2  
  90.   End If  
  91.   Max = Result  
  92. End Function  

Ensuite, fermez Macro Editor et retour à la feuille de travail LibreOffice Calc - vous pouvez maintenant utiliser notre nouvelle fonctionnalité FuzzyLookup() .

Utiliser l'extension

Vous pouvez également utiliser la fonctionnalité FUZZYLOOKUP() en installant l'extension gratuite YouLibreCalc.oxt ou sa version complète YLC_Utilities.oxt .

Après cela, cette fonction sera disponible dans tous les fichiers qui seront ouverts dans LibreOffice Calc.